出处:掘金

原作者:前端微白


Loader 与 Plugin 区别

维度 Loader Plugin
工作阶段 文件加载时(单文件处理) 整个构建周期(全局操作)
功能 转换文件内容 扩展构建能力
典型场景 编译 JSX/SASS 资源优化/环境注入

Loader 核心:文件转换引擎

1. babel-loader:JS 语法兼容

// webpack.config.js  
module.exports = {  
  module: {  
    rules: [  
      {  
        test: /\.js$/,  
        exclude: /node_modules/, // 关键!避免编译已兼容代码  
        use: {  
          loader: 'babel-loader',  
          options: {  
            presets: [  
              ['@babel/preset-env', { targets: "iOS >= 9, Chrome > 60" }]  
            ]  
          }  
        }  
      }  
    ]  
  }  
}

2. css-loader + style-loader:CSS 模块化处理

3. sass-loader:预处理器支持

4. thread-loader:并行编译

{  
  test: /\.js$/,  
  use: [  
    {  
      loader: 'thread-loader',  
      options: { workers: 4 } // 根据 CPU 核心数配置  
    },  
    'babel-loader' // 后续 loader 在 worker 线程运行  
  ]  
}

Plugin 核心:构建流程扩展

1. HtmlWebpackPlugin:HTML 模板管理

// 自动注入所有 chunk  
new HtmlWebpackPlugin({  
  template: './src/index.html', // 自定义模板  
  filename: 'home.html',  
  chunks: ['vendors', 'home'] // 仅注入指定 chunk  
})

2. MiniCssExtractPlugin:CSS 文件分离

方案 开发环境 生产环境 特点
style-loader 样式内联
MiniCssExtractPlugin 独立 CSS 文件
// 替代 style-loader  
const MiniCssExtractPlugin = require('mini-css-extract-plugin');  
module.exports = {  
  plugins: [new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' })],  
  module: {  
    rules: [  
      {  
        test: /\.css$/,  
        use: [MiniCssExtractPlugin.loader, 'css-loader'] // 链式调用  
      }  
    ]  
  }  
};

3. DefinePlugin:环境变量注入

// webpack.prod.js  
new webpack.DefinePlugin({  
  'process.env.API_BASE': JSON.stringify('https://api.prod.com')  
});

// webpack.dev.js  
new webpack.DefinePlugin({  
  'process.env.API_BASE': JSON.stringify('https://api.dev.com')  
});

// 代码中使用  
axios.get(`${process.env.API_BASE}/user`);

4. SplitChunksPlugin:代码拆分

optimization: {  
  splitChunks: {  
    chunks: 'all',  
    cacheGroups: {  
      vendors: {  
        test: /[\\/]node_modules[\\/]/,  
        name: 'vendors',  
      }  
    }  
  }  
}